package com.lms.map;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @Author: 李孟帅
 * @CreateTime: 2020-05-29 07:05
 * @Description:
 */
public class MapDemo {
    public static void main(String[] args) {
        Map<String, Object> map = new HashMap<>();
        //将指定的值与该映射中的指定键相关联（可选操作）。 如果映射先前包含了密钥的映射，则旧值将被指定的值替换。 （映射m被认为包含关键字的映射k当且仅当m.containsKey(k)将返回true ）。
        Object a1 = map.put("a", 1);//返回旧值，null
        map.clear();
        map.put("b", 2);
        map.put("c", 3);
        //尝试计算指定键的映射及其当前映射的值（如果没有当前映射， null ）。 需要传入二元函数，会修改映射的value，2-》6
        Object b = map.compute("b", (key, value) -> {
            System.out.println(key);
            value = (Integer) value * 3;
            return value;
        });
        //如果指定的密钥的值存在且非空，则尝试计算给定密钥及其当前映射值的新映射。
        Object c = map.computeIfPresent("c", (key, value) -> {
            System.out.println(key);
            value = (Integer) value * 3;
            return value;
        });
        //如果指定的键尚未与值相关联（或映射到 null ），则尝试使用给定的映射函数计算其值，并将其输入到此映射中，除非 null
        Object d = map.computeIfAbsent("d", key -> {
            System.out.println(key);
            return key + "--";
        });
        //如果此映射包含指定键的映射，则返回 true 。
        boolean a = map.containsKey("b");
        //如果此地图将一个或多个键映射到指定的值，则返回 true 。
        boolean b1 = map.containsValue(6);
        //返回此地图中包含的映射的Set视图。
        Set<Map.Entry<String, Object>> entrySet = map.entrySet();
        entrySet.forEach(entry -> {
            String key = entry.getKey();
            Object value = entry.getValue();
            System.out.println("key:" + key + ",value:" + value);
        });
        //对此映射中的每个条目执行给定的操作，直到所有条目都被处理或操作引发异常。
        map.forEach((key, value) -> System.out.println("key:" + key + " value:" + value));
        //返回到指定键所映射的值，或 null如果此映射包含该键的映射。
        Object d1 = map.get("d");
        //返回到指定键所映射的值，或 defaultValue如果此映射不包含该键的映射。
        Object d2 = map.getOrDefault("3", 4);
        //如果此地图不包含键值映射，则返回 true 。
        boolean empty = map.isEmpty();
        //返回此地图中包含的键的Set视图。
        Set<String> keySet = map.keySet();
        keySet.forEach(key-> System.out.println(map.get(key)));
        //如果指定的键尚未与值相关联或与null相关联，则将其与给定的非空值相关联,不会执行lamda表达式，如果已经关联，执行响应的计算
        map.merge("e",1,(oldValue,value)->{
            System.out.println(value); //1
            System.out.println(oldValue); //9
            return (int)value*10;
        });
        //如果指定的键尚未与某个值相关联（或映射到 null ）将其与给定值相关联并返回 null ，否则返回当前值。存在时不会覆盖
        Object f = map.putIfAbsent("f", 4);
        //如果存在（从可选的操作），从该地图中删除一个键的映射。
        map.remove("e");
        //仅当指定的密钥当前映射到指定的值时删除该条目。
        boolean b2 = map.remove("b", 6);
        //只有当目标映射到某个值时(即存在键值)，才能替换指定键的条目。
        Object c1 = map.replace("c", 90);
        //仅当当前映射到指定的值时，才能替换指定键的条目。
        boolean c2 = map.replace("c", 90, 80);
        //将每个条目的值替换为对该条目调用给定函数的结果，直到所有条目都被处理或该函数抛出异常。
        map.replaceAll((key,value)->{
            System.out.println("处理key:"+key+",value:"+value);
            return 55;  //将所有的value改为55
        });
        map.forEach((key, value) -> System.out.println("key:" + key + " value:" + value));
        //返回此地图中键值映射的数量。
        int size = map.size();
        //返回此地图中包含的值的Collection视图。
        Collection<Object> values = map.values();

    }
}
